package fifteenth.工厂设计模式;

interface Fruit{
    public void eat();
}
class Apple implements Fruit {
    @Override
    public void eat() {
        System.out.println("我吃个苹果！");
    }
}
class Orange implements Fruit{
    @Override
    public void eat() {
        System.out.println("我吃个橘子！");
    }
}
class Factory{
    public static Fruit getInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Fruit fruit = (Fruit) Class.forName(className).newInstance();
        return fruit;
    }
}
public class 使用反射完成工厂设计模式 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        //通过工厂类取得接口实例，传入完整的包.类名称
        Fruit fruit =Factory.getInstance("fifteenth.工厂设计模式.Apple");
        if(fruit!=null){
            fruit.eat();
        }
    }
}
/**
 * 以上的工厂操作类使用了反射操作取得Fruit实例，这样无论增加多少个子类，工厂类都不用做任何的修改
 *
 * 以上的操作代码虽然可以通过反射得到接口的实例，但是在操作的时候需要传入的完整的包.类名称，而且用户也无法知道一个接口有多少个可以使用的子类
 * 所以此时可以通过属性文件的形式配置所要的子类信息
 */
/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=55603:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 fifteenth.工厂设计模式.使用反射完成工厂设计模式
我吃个苹果！

Process finished with exit code 0

 */